package main

import (
	"flag"
	"os"
	"os/signal"
	"syscall"
	"ws-demo-go/internal/business/client"
	"ws-demo-go/internal/business/server"
	"ws-demo-go/pkg/logger"
)

func main() {
	// 解析命令行参数
	mode := flag.String("mode", "server", "运行模式: server 或 client")
	addr := flag.String("addr", ":8080", "服务端监听地址")
	serverAddr := flag.String("server", "ws://localhost:8080/ws", "服务端地址")
	flag.Parse()

	// 创建信号通道，用于优雅退出
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

	switch *mode {
	case "server":
		// 启动服务端模式
		startServer(*addr, sigChan)
	case "client":
		// 启动客户端模式
		startClient(*serverAddr, sigChan)
	default:
		logger.Error("Unsupported mode. Use 'server' or 'client'")
	}
}

// 启动服务端
func startServer(addr string, sigChan <-chan os.Signal) {
	logger.Info("Starting in server mode...")

	// 创建业务层服务端
	bs := server.NewBusinessServer(addr)

	// 在单独的 goroutine 中启动服务，避免阻塞主线程
	serverErrChan := make(chan error, 1)
	go func() {
		if err := bs.Start(); err != nil {
			serverErrChan <- err
		}
	}()

	// 等待退出信号或服务错误
	select {
	case sig := <-sigChan:
		logger.Info("Received signal: %v", sig)
		// 停止服务
		bs.Stop()
	case err := <-serverErrChan:
		logger.Error("Server error: %v", err)
	}
}

// 启动客户端
func startClient(serverAddr string, sigChan <-chan os.Signal) {
	logger.Info("Starting in client mode...")

	// 创建业务层客户端（启用自动重连）
	bc := client.NewBusinessClient(serverAddr, true)

	// 连接到服务端
	if err := bc.Connect(); err != nil {
		logger.Error("Failed to connect to server: %v", err)
		return
	}

	// 发送示例消息
	go bc.ExampleSendMessages()

	// 等待退出信号
	<-sigChan
	logger.Info("Received exit signal, closing bc...")
	// 关闭客户端连接
	bc.Close()
}
